/*
 * Grafo.cpp
 *
 *  Created on: 16/10/2012
 *      Author: vagner
 */

#include "Grafo.h"
#include <iostream>
#include <cstdio>
#include <cstdlib>

namespace computacaoNatural {

Grafo::Grafo() {
	// do nothing

}

Grafo::Grafo(int numVertices){
	if(numVertices > 0){
		this->pVertice = new Vertices();
		this->MD = new MatrizDistancia(numVertices, numVertices);
		this->numVertices = numVertices;
	}else{
		std::cout << "Valor informando é invalido: " << numVertices << std::endl;
	}

}

Grafo::~Grafo() {
	delete this->pVertice;
	delete this->MD;
}

void Grafo::insereVertice(const Vertice& v){

	pVertice->push_back(v);

}

void Grafo::showVertices(void) const{
	Vertices::iterator itVertices;

	for(itVertices = pVertice->begin(); itVertices < pVertice->end();itVertices++){
		std::cout << "ID Vértice: " << itVertices->idVertice << std::endl;
		std::cout << "Coordenada X: " << itVertices->coorX << std::endl;
		std::cout << "Coordenada Y: " << itVertices->coorY << std::endl;
		std::cout << "Capacidade: " << itVertices->capacidade << std::endl;
		std::cout << "Demanda: " << itVertices->demanda << std::endl;
		std::cout << "********************************"<<std::endl;

	}
}

void Grafo::calculaMatrizDistancia(){

	int numVertices = pVertice->size();
	Item auxItem;
	for(int i = 0;i<numVertices;i++){
		for(int j = 0; j < numVertices;j++){
			auxItem.valor.realValor = distanciaEntreVertices(pVertice->at(i),pVertice->at(j));
			MD->insereItem(auxItem,i,j);
		}
	}
}

void Grafo::showMatrizDistancia()const{
	MD->show();
}

int Grafo::getCapacidade(int idVertice){
	return pVertice->at(idVertice).capacidade;
}

int Grafo::getDemanda(int idVertice){

	return pVertice->at(idVertice).demanda;
}

int Grafo::getNumVertices(){
	return this->numVertices;
}

double Grafo::getDistancia(int vertic_1, int vertice_2){

	Item returnItem =	MD->getItem(vertic_1, vertice_2);


	return (returnItem.valor.realValor);

}

} /* namespace computacaoNatural */
